home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / qformat1.zip / BRECORD.CPP next >
C/C++ Source or Header  |  1993-01-18  |  4KB  |  122 lines

  1. //      BRECORD     . . .    List device parameter block information
  2.  
  3. #include    <dos.h>
  4. #include    <string.h>
  5. #include    <stdlib.h>
  6. #include    <stdio.h>
  7. #include    <iostream.h>                 
  8. #include    <iomanip.h>
  9. #include    <ctype.h>
  10.  
  11. typedef    unsigned char   byte;
  12. typedef    unsigned int    WORD;
  13. typedef    unsigned long   dword;
  14.  
  15. const char NUL = '\0';
  16.  
  17. class dpb {
  18.   public:
  19.     byte    driveno;            // Drive number (0 == default)
  20.     byte    unit;               // Unit number within driver
  21.     WORD    bpers;              // Bytes per sector
  22.     byte    hisect;             // Highest sector number in cluster
  23.     byte    shift;              // To convert clusters into sectors
  24.     WORD    reserved;           // Reserved sectors
  25.     byte    nfats;              // Number of FATs
  26.     WORD    ndir;               // Number of root directory entries
  27.     WORD    data;               // Number of first sector with user data
  28.     WORD    ndata;              // Highest cluster number + 1
  29.                                 //   16 bit FAT if > 0ff6
  30.     WORD    sperf;              // Sectors per FAT
  31.     WORD    sdir;               // Number of first directory sector
  32.     dpb     far *dhdr;          // Address of device driver header
  33.     byte    media;              // Media ID byte
  34.     byte    clean;              // 0 if disk accessedm else FF
  35.     dpb     far *next;          // Pointer to next DPB
  36.     WORD    search;             // Search start cluster, usually the last
  37.                                 //  allocated
  38.     WORD    nfree;              // Number of free clusters on drive or FFFFh
  39.  
  40.     WORD    infolevel;
  41.     WORD    Slo;                // Serial # (low order word)
  42.     WORD    Shi;                //          (high order word)
  43.     char    label[11];          // Volume label
  44.     char    ftype[8];           // File system type
  45.  
  46.     unsigned *FAT;              // Points to FAT buffer
  47.     char    is16bit;            // Set if 16 bit FAT
  48.  
  49.     dpb(char);                  // Constructor
  50.     void    list();             // List dpb to cout
  51.     void    erase();
  52.     unsigned sector(unsigned);
  53.     unsigned getentry(unsigned);
  54.     void     zapentry(unsigned);
  55. };
  56.  
  57. dpb::dpb(char drv)
  58. {
  59.     void far *result;           // Points to DOS copy of the dpb
  60. asm {
  61.     push ds
  62.     mov dl,drv
  63.     and dl,15
  64.     mov ah,0x32
  65.     int 0x21
  66.     xor al,al
  67.     je  okay
  68.     xor bx,bx
  69.     mov ds,bx
  70.     }
  71. okay:
  72. asm {
  73.     mov dx,ds
  74.     pop ds
  75.     }
  76.     result = MK_FP(_DX, _BX);
  77.     _fmemcpy((void *)this, result, 33);
  78.     _DX = (unsigned)&infolevel;
  79. asm {
  80.     mov bl,drv
  81.     and bl,15
  82.     mov ax,0x6900
  83.     int 0x21
  84.     }
  85.     is16bit = ftype[4] == '6';
  86.     ftype[5] = NUL;
  87. }
  88.  
  89. void dpb::list()
  90. {
  91.     char save = *ftype; *ftype = NUL;       // Temporary hack
  92.     cout.setf(ios::left);
  93.     cout << "\n\tDrive Parameter Block\n" <<
  94.         "\n\tDrive " << (char)('A' + driveno) <<
  95.         "\n\tBytes per sector                  " << bpers <<
  96.         "\n\tSectors per cluster               " << (hisect + 1) <<
  97.         "\n\tClusters to sectors shift         " << (int)shift <<
  98.         "\n\tReserved sectors                  " << reserved <<
  99.         "\n\tNumber of FATs                    " << (int)nfats <<
  100.         "\n\tNumber of root directory entries  " << ndir <<
  101.         "\n\tFirst user data sector            " << data <<
  102.         "\n\tNumber of data clusters           " << (ndata - 1);
  103.     if (nfree != 65535) {
  104. cout << "\n\tNumber of free clusters           " << nfree ;}
  105. cout << "\n\tSearch start cluster              " << search <<
  106.         "\n\tSectors per FAT                   " << sperf <<
  107.         "\n\tFirst directory sector            " << sdir <<
  108.         "\n\tMedia ID byte                     " << hex << (int)media <<
  109.         "\n\tSerial number                     " << Shi << ':' << Slo <<
  110.         "\n\tVolume label                      " << setw(11) << label;
  111.     *ftype = save; cout <<
  112.         "\n\tFile system type                  " << setw(8) << ftype <<
  113.         "\n\n";
  114. }
  115.  
  116. void main(int, char *argv[])
  117. {
  118.     dpb *disk = new dpb(*argv[1]);
  119.     disk->list();
  120. }
  121.  
  122.